.text   		// 代码段
.global _start


_start:

/* 关闭看门狗 */
ldr r0, = 0x53000000
ldr r1, = 0
str r1, [r0]


/* 设置MPLL, FCLK : HCLK : PCLK = 400M : 100M : 50M */
/* LOCKTIME(0x4c000000) = 0xFFFFFFFF */
ldr r0, = 0x4c000000
ldr r1, = 0xFFFFFFFF
str r1, [r0]

/* CLKDIVN(0x4c000014) = 0x5,tFCLK : tHCLK : tPCLK = 1:4:8 */
ldr r0, = 0x4c000014
ldr r1, = 0x5
str r1, [r0]

/*设置CPU工作于异步模式  数据手册 244页 */
mrc p15,0,r0,c1,c0,0
orr r0,r0,#0xc0000000   //R1_nF:OR:R1_iA
mcr p15,0,r0,c1,c0,0

/* 设置MPLLCON(0x4c000004) = (92 << 12) | (1 << 4) | (1 << 0)*/
/* m = MDIV + 8 = 92 + 8 = 100*/
/* p = PDIV + 2 = 1 + 2 = 3*/
/* s = SDIV = 1*/
/* FCLK = 2*m*Fin / (p*2^s) = 400M*/
ldr r0, = 0x4c000004
ldr r1, = ((92 << 12) | (1 << 4) | (1 << 0))
str r1, [r0]

/* 设置MPLL的现象在于 delay函数  会执行的非常快*/


/* 设置内存 sp栈 */
/* 依据 nor启动时 0地址对应片内ram 不能随意写*/
/* 写 0 到 0 地址 如果读出来是0 则为 nand启动 否则为 nor 启动 */

mov r1, #0
ldr r0, [r1]   				/*读出原来的值备份*/
str r1, [r1]				/*把0写入0地址*/
ldr r2, [r1]				
cmp r1, r2                               /* r1 == r2 表明nand启动  则执行 moveq命令*/
ldr sp, = 0x40000000 + 4096
moveq sp, #4096
streq r0, [r1]				/*恢复原来的值*/

bl sdram_init

/* 在进入main函数之前 需要重定位 */
ldr r1, =data_load_addr  /* data 在bin文件中的地址 即加载地址 */
ldr r2, =data_start      /* 重定位地址 即运行地址 */ 
ldr r3, =data_end        /*data 段结束地址 */

cpy:
    ldrb r4, [r1]
    strb r4, [r2]
    add  r1, r1, #1
    add  r2, r2, #1
    cmp r2,r3
    bne cpy

bl main

halt:
    B halt
